package com.hm.hall.commons.service;

import com.alibaba.fastjson.JSONObject;
import com.hm.hall.commons.dao.BattleRoomMapper;
import com.hm.hall.commons.domain.BattleRoom;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;

@Service
public class TranBattleService {

    Logger log = Logger.getLogger(TranBattleService.class);

    @Autowired
    private BattleRoomMapper battleRoomMapper;

    /**
     *  隔离级别 Isolation
     *      READ_UNCOMMITTED 最低级别，可以读另外一个事务修改但是没有提交的内容，一般不使用
     *      DEFAULT READ_COMMITTED 默认事务隔离级别 读到一个其他事务已经提交的内容
     *      REPEATABLE_READ 多次查询都不会读到其他事务已经提交的内容 保证该事务执行时每次查询的内容一致
     *      SERIALIZABLE 所有事务依次执行
     *  传播级别 Propagation
     *      REQUIRED：如果当前存在事务，则加入该事务；如果当前没有事务，则创建一个新的事务。
     *      SUPPORTS：如果当前存在事务，则加入该事务；如果当前没有事务，则以非事务的方式继续运行。
     *      MANDATORY：如果当前存在事务，则加入该事务；如果当前没有事务，则抛出异常。
     *      REQUIRES_NEW：创建一个新的事务，如果当前存在事务，则把当前事务挂起。
     *      NOT_SUPPORTED：以非事务方式运行，如果当前存在事务，则把当前事务挂起。
     *      NEVER：以非事务方式运行，如果当前存在事务，则抛出异常。
     *      NESTED：如果当前存在事务，则创建一个事务作为当前事务的嵌套事务来运行；如果当前没有事务，则该取值等价于REQUIRED
     */
    @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)
    public void insertBattleRoom() {
        for (int i = 0; i < 10; i++) {
            BattleRoom room = new BattleRoom();
            room.setTitle("Transactional-" + i + "--房间");
            battleRoomMapper.insertSelectiveGetKey(room);
            log.info(JSONObject.toJSONString(room));
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }

}
